﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>ControlSend / ControlSendRaw</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../css/commands.css" rel="stylesheet" type="text/css">
<link href="../css/print.css" rel="stylesheet" type="text/css" media="print">
</head>
<body>

<h1>ControlSend / ControlSendRaw</h1>

<p>向一个窗口或控件发送模拟键击。</p>

<p class="CommandSyntax">ControlSend [, Control, Keys, WinTitle, WinText, ExcludeTitle, ExcludeText]<br>
ControlSendRaw: 参数同上。</p>
<h3>Parameters</h3>
<table border="1" width="100%" cellspacing="0" cellpadding="3" bordercolor="#C0C0C0">
  <tr>
    <td width="15%">Control</td>
    <td width="85%"><p>可以是控件的名称/文本或 ClassNN (控件的 classname(类名)和序号)，它们都可以通过 Window Spy 来确定。当使用名称/文本时，matching behavior(匹配模式)通过 <a href="SetTitleMatchMode.htm">SetTitleMatchMode </a>决定。如果此参数为空或省略，目标窗口的顶端控件将被使用。如果这个参数为 ahk_parent，键击将会被直接发送到控件的父窗口 (见实例 <a href="../misc/Winamp.htm">Automating Winamp</a>)。</p>
    <p>要对一个控件的 HWND (窗口句柄)进行操作，将 <EM>Control</EM> 参数留空并为 <EM>WinTitle</EM> 参数指定 <EM>ahk_id %ControlHwnd%</EM> (这样即使当 <A 
      href="DetectHiddenWindows.htm">DetectHiddenWindows</A> 是 Off 
    状态，它也能对隐藏的控件起作用)。一个控件的 HWND 往往由&nbsp;<A 
      href="ControlGet.htm#Hwnd">ControlGet Hwnd</A>&nbsp;、<A 
      href="MouseGetPos.htm">MouseGetPos</A>&nbsp;或 <A 
      href="DllCall.htm">DllCall</A>&nbsp;取得。</p></td>
  </tr>
  <tr>
    <td>Keys</td>
    <td><p>一连串要发送的按键(详细请见 <a href="Send.htm">Send</a> 命令)。如要发送一个原义的逗号，请进行 <a href="_EscapeChar.htm">escape(转义) </a>(例：`, )。键击被发送的速率由 <a href="SetKeyDelay.htm">SetKeyDelay </a>来决定。</p>
    <p>与 <a href="Send.htm">Send</a> 命令不同的是，鼠标点击不能通过 ControlSend 来发送，请用 <a href="ControlClick.htm">ControlClick </a>。</p></td>
  </tr>
  <tr>
    <td>WinTitle</td>
    <td>目标窗口的标题或副标题(匹配模式由 <A 
      href="SetTitleMatchMode.htm">SetTitleMatchMode</A>&nbsp;决定)。如果此参数和后面的3个参数被省略，<A 
      href="../LastFoundWindow.htm">Last Found Window</A>(最近找到的窗口) 将被使用。如果此参数是字母 
      A 并且后面的三个参数被省略，激活的窗口将被使用。要使用一个窗口类，指定 ahk_class 确切的类名(通过 Window Spy 
      显示)。要使用一个 <A href="Process.htm">process identifier (PID)</A>(进程标识符)，指定 
      ahk_pid %包含PID的变量% 。要使用一个 <A href="GroupAdd.htm">window group</A>(窗口组)，指定 
      ahk_group GroupName 。要使用一个窗口的 <A href="WinGet.htm">unique ID 
      number</A>(唯一标识符编号)，指定 ahk_id %包含ID的变量% 。通过指定 <A 
      href="../LastFoundWindow.htm#multi">multiple criteria</A>(多个条件) 缩小搜索范围。 
    例如：<EM>My File.txt ahk_class Notepad</EM></td>
  </tr>
  <tr>
    <td>WinText</td>
    <td>如果用到，此参数必须是目标窗口的一个单独 text element(文本对象)的 substring(子字串) (像内置的 Window 
      Spy 工具显示的一样)。如果 <A href="DetectHiddenText.htm">DetectHiddenText</A> 是 ON 
    的状态，隐藏的文本对象将被探测。</td>
  </tr>
  <tr>
    <td>ExcludeTitle</td>
    <td>标题含有此参数值的窗口将不被考虑。</td>
  </tr>
  <tr>
    <td>ExcludeText</td>
    <td>文本含有此参数值的窗口将不被考虑。</td>
  </tr>
</table>

<h3>ErrorLevel</h3>
<p>如果遇到一个问题 <A href="../misc/ErrorLevel.htm">ErrorLevel</A> 设为 1 ，否则是 0 。</p>
<h3>Remarks</h3>
<p><span class="CommandSyntax">ControlSendRaw</span> 命令准确地按照键击本身在<em>Keys</em> 参数中显示的那样发送，而不是将 {Enter} 转换成一个 ENTER 键击，^c 转换成 Control-C   键击等等。</p>
<p>如果 <em>Control</em> 参数被省略，或目标窗口自身没有控件时，该命令将尝试通过发送到它的顶端控件(通常是正确的那一个)来直接发送到目标窗口。当一个窗口自身根本不带有控件或无所谓发送到哪个控件时，这么做是非常有用的。</p>
<p>默认情况下，修饰键(Control，Alt，Shift，和 Win 键) 将通常那样的通过 <a href="Send.htm">Send</a> 命令被发送。这样可以让命令提示符和其他控制台窗口正确地检测到大写字母，键控字符等等。同时这样也提高了在其他方面上的可靠性。</p>
<p>然而，在某些情况下这些修饰键事件可能会干扰当前激活的窗口，尤其当一个 ControlSend 命令正在执行或 Alt 键正被发送(因为 Alt 键激活了当前激活窗口的菜单栏)，而用户也正在活跃地打字的时候。通过明确地发送修饰键的按下和弹起事件可以避免这种情况的发生，如这个例子：<br>
ControlSend, Edit1, {Alt down}f{Alt up}, 无标题 - 记事本</p>
<p>以上这种方式同时使得修饰键(Control/Alt/Shift/Win)的发送在工作站被锁定时(被登录提示框保护时)也生效。</p>
<p>当正在对一个控制台窗口如命令提示符使用 ControlSend 命令时，应避免使用 <a href="BlockInput.htm">BlockInput</a> 命令。这是因为，这么做会阻碍大小写按钮和修饰键(比如 Control 键)的正常工作。</p>
<p><a href="SetKeyDelay.htm">SetKeyDelay</a> 命令设置的数值决定按键被发送的速度。如果目标窗口无法正确可靠地接受键击，请尝试通过增加 <a href="SetKeyDelay.htm">SetKeyDelay</a> 命令的第二个参数来增加按键时长，如这些例子：<br>
SetKeyDelay, 10, 10<br>
SetKeyDelay, 0, 10<br>
SetKeyDelay, -1, 0</p>
<p>如果目标控件是一个 Edit(输入框) 控件(或某些类似的)，以下命令以下的代码通常会比 ControlSend 更可靠并且更快：<br>
<a href="Control.htm">Control</a>, EditPaste, 这些文本将会被插入到光标处。, ControlName, WinTitle<br>
<a href="ControlSetText.htm">ControlSetText</a>, ControlName, 这些文本将会完全替换掉已存在的文本。, WinTitle </p>
<p>ControlSend 命令通常并不能很好地操控窗口的菜单栏。要解决这个问题，使用 <a href="WinMenuSelectItem.htm">WinMenuSelectItem</a> 命令。如果由于菜单栏的类型导致这么做并不可行，您可以尝试通过学习 <a href="../misc/SendMessage.htm">SendMessage Tutorial(发送消息指南)</a> 来了解消息以操控需要的菜单项。</p>
<p>窗口的标题和窗口中的文字是大小写敏感的。要检测隐藏窗口，必须打开<a href="DetectHiddenWindows.htm"> DetectHiddenWindows</a> 。</p>
<h3>Related</h3>
<p><a href="SetKeyDelay.htm">SetKeyDelay</a>, <a href="_EscapeChar.htm">Escape sequences (e.g. `%) </a>, <a href="Control.htm">Control</a>, <a href="ControlGet.htm">ControlGet</a>, <a href="ControlGetText.htm">ControlGetText</a>, <a href="ControlMove.htm">ControlMove</a>, <a href="ControlGetPos.htm">ControlGetPos</a>, <a href="ControlClick.htm">ControlClick</a>, <a href="ControlSetText.htm">ControlSetText</a>, <a href="ControlFocus.htm">ControlFocus</a>, <a href="Send.htm">Send, </a><a href="../misc/Winamp.htm">Automating Winamp</a></p>
<h3>Examples</h3>
<pre class="NoIndent">ControlSend, Edit1, 这是一行在记事本窗口中的文本。,  无标题
SetTitleMatchMode, 2
ControlSend, , abc, cmd.exe  <em>; 直接发送到命令提示符窗口。</em></pre>


</body>
</html>
